/*不定参宏的用法*/

#define _GNU_SOURCE 
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

#define LOG(fmt, ...) printf("[%s:%d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)
 
//C中不定参函数的使用，不定参数据的访问
void printNum(int count, ...)
{
    va_list ap;
    va_start(ap, count); //获取指定参数的起始地址，这里就是获取count参数之后的第一个参数的起始地址
    for(int i = 0; i < count; i++){
        int num = va_arg(ap, int); //从ap中获取一个int类型的参数
        printf("param[%d]:%d\n", i, num);
    }
    va_end(ap); //ap指针置空
}

void myprintf(const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt); //获取指定参数的起始地址，这里就是获取count参数之后的第一个参数的起始地址
    char *res;
    int ret = vasprintf(&res, fmt, ap); //返回字符串长度，失败返回-1
    if(ret != -1) {
        printf("%s", res);
        free(res);
    }
    va_end(ap); //ap指针置空
}

int main()
{
    LOG("%s-%s", "hello", "小刘今天也在学习");
    printNum(2, 666, 777);
    printNum(5, 1, 2, 3, 4, 5);
    myprintf("%d%s\n", 1, "战上岸");
    return 0;
}
//gcc args.c -o args